package com.example.Utils;

import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

/**
 * 这段代码是一个通用的解决方案，用于处理所有可能包含非ASCII字符的文件名，
 * 而不仅仅是中文文件名（肯定最多情况就是中文），它的目的是确保文件名在任何语言环境下都能被正确处理和显示。
 * <p>
 * 问题：文件下载时，不同浏览器对文件名的编码处理是不一致的（以中文文件名为例）
 * 目的：处理文件下载时的中文文件名编码问题，以确保在不同浏览器中都能正确显示文件名，防止文件名中的特殊字符导致下载失败或显示乱码
 * 原理：首先获取请求头中的User-Agent信息，用于判断浏览器类型
 * 针对不同浏览器，中文文件名采用不同的编码方式：
 * 1.IE浏览器（包括以IE为内核的浏览器）：对中文文件名，使用URLEncoder进行UTF-8编码
 * 2.其他浏览器：对中文文件名进行UTF-8编码，然后将编码后的字节转换进行ISO-8859-1编码
 */
public class FileNameEncodingUtils {

    public static String convertToFileName(String fileName, HttpServletRequest request) throws UnsupportedEncodingException {
        String userAgent = request.getHeader("User-Agent");
        // 针对IE或者以IE为内核的浏览器：
        if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
            // 使用URLEncoder.encode()将文件名编码为UTF-8格式
            fileName = URLEncoder.encode(fileName, "UTF-8");
        } else {
            // 非IE浏览器的处理：先将文件名转为UTF-8字节数组，再用ISO-8859-1编码重新构造字符串
            fileName = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
        }
        return fileName;
    }
}
